/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package Negocio;

import BaseDatos.GestorBD;
import Util.GestorErrores;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Date;
import java.util.Vector;
import Util.Varios;

/**
 *
 * @author Javi
 */
public class ClienteDatPers implements ObjetoDatos{
    //Nombre de la tabla de la Base de Datos
    private String _sNombreTabla = "ClienteDatPers";
    //Descripción de la tabla de la Base de Datos
    private String _sDescripTabla = "Clientes";
    //Condición where
    private String sCondWhere = "";
    //Atributos de la tabla Clientes
    private int _iIdCliente;
    private String _sNombre;
    private String _sApellidos;
    private Date _dFechaNacimiento;
    private String _sSexo;
    private String _sNacionalidad;
    private boolean _bExtranjero;
    private String _sNivelEstudios;
    private boolean _bPermisoResidencia;
    private String _sTipoDocumento;
    private int _iAniosResidencia;
    private String _sNumDocumento;

    /*
     * Recupera todo el contenido de la tabla y lo devuelvo en 2 vectores. Uno con los nombres de los campos y
     * otro vector de vectores con los datos propiamente dichos (cada tupla de datos en un vector). El orden de los
     * campos de la fila es el mismo que el de los nombres de los campos.
     */
    public boolean selectAll ( Vector columnIdentifiers, Vector dataVector){
        String sCondicion = ""; 
        //Si hay alguna condición se añade a la sentencia
        if (this.sCondWhere.compareTo("") != 0)
            sCondicion = " WHERE " + this.sCondWhere;
        try {
            Statement st = GestorBD.getInstancia().getConexion().createStatement();
            ResultSet rs = st.executeQuery("SELECT * FROM " + this._sNombreTabla + sCondicion + " ORDER BY Apellidos, Nombre");
            ResultSetMetaData metaDatos = rs.getMetaData();
            // Se obtiene el número de columnas.
            int numeroColumnas = metaDatos.getColumnCount();
            // Se obtiene cada una de las etiquetas para cada columna
            for (int i = 0; i < numeroColumnas; i++){
               // Nuevamente, para ResultSetMetaData la primera columna es la 1.
               columnIdentifiers.addElement( metaDatos.getColumnLabel(i + 1) );
            }

            while (rs.next()) {
                // Se crea un vector que será cada fila de la tabla.
                Vector fila = new Vector (numeroColumnas);

                // Se rellena cada posición del vector con una de las columnas de la tabla en base de datos.
                for (int i = 0; i < numeroColumnas; i++)
                    fila.addElement ( rs.getObject(i+1) ); // El primer indice en rs es el 1, no el cero, por eso se suma 1.

                // Se añade al modelo la fila completa.
                dataVector.addElement( fila );
            }
            rs.close();
            st.close();
            return true;
        }catch (SQLException e1){
            GestorErrores.getInstancia().getvErrores().add ( e1.getMessage() );
        }catch(Exception e){
            e.printStackTrace();
        }
        return false;
    }

    /*
     * Inserta un registro en la tabla
     */
    public boolean insert ( ){
        if ( !validar () )
            return false;
        String sSQL = "INSERT INTO " + this._sNombreTabla + " (Nombre, Apellidos, FechaNacimiento, Sexo," +
            " Nacionalidad, Extranjero, NivelEstudios, PermisoResidencia, TipoDocumento, AniosResidencia, NumDocumento) VALUES ('" +
            this._sNombre + "', '" + this._sApellidos + "', '" + Varios.dateToString (this._dFechaNacimiento) + "', '" +
            this._sSexo + "', '" + this._sNacionalidad + "', " + Varios.booleanToInteger(this._bExtranjero) +
            ", '" + this._sNivelEstudios + "', " +
            Varios.booleanToInteger(this._bPermisoResidencia) + ", '" + this._sTipoDocumento + "', " +
            this._iAniosResidencia + ", '" +
            this._sNumDocumento + "')";
        try {
            Statement st = GestorBD.getInstancia().getConexion().createStatement();
            st.execute(sSQL);
            st.close();

            //Recuperar y cargar en la clase el valor de la clave AUTONUMERICA generada por el motor de BD
            this._iIdCliente = GestorBD.obtenerLastAutonumerico();
            return true;
        }catch (SQLException e1){
            GestorErrores.getInstancia().getvErrores().add ( e1.getMessage() );
        }catch(Exception e){
            e.printStackTrace();
        }
        return false;
    }


    /*
     * Actualiza un registro en la entidad auxiliar
     */
    public boolean update ( ){
        if ( !validar () )
            return false;
        String sSQL = "UPDATE " + this._sNombreTabla + " SET Nombre = '" + this._sNombre + "', " +
            " Apellidos = '" + this._sApellidos + "', " +
            " FechaNacimiento = '" + Varios.dateToString (this._dFechaNacimiento) + "', " +
            " Sexo = '" + this._sSexo + "', " +
            " Nacionalidad = '" + this._sNacionalidad + "', " +
            " Extranjero = " + Varios.booleanToInteger(this._bExtranjero) + ", " +
            " NivelEstudios = '" + this._sNivelEstudios + "', " +
            " PermisoResidencia = " + Varios.booleanToInteger(this._bPermisoResidencia) + ", " +
            " TipoDocumento = '" + this._sTipoDocumento + "', " +
            " AniosResidencia = " + this._iAniosResidencia + "," +
            " NumDocumento ='" + this._sNumDocumento + "'" +
             " WHERE IdCliente = " + this._iIdCliente;
        try {
            Statement st = GestorBD.getInstancia().getConexion().createStatement();
            st.execute(sSQL);
            st.close();
            return true;
        }catch (SQLException e1){
            GestorErrores.getInstancia().getvErrores().add ( e1.getMessage() );
        }catch(Exception e){
            e.printStackTrace();
        }
        return false;
    }

    /*
     * Borra un registro de la Entidad Auxiliar
     */
    public boolean delete (){

        String sSQL = "DELETE FROM " + this._sNombreTabla + " WHERE " +
            " IdCliente = " + this._iIdCliente;
        try {
            Statement st = GestorBD.getInstancia().getConexion().createStatement();
            st.execute(sSQL);
            st.close();
            return true;
        }catch (SQLException e1){
            GestorErrores.getInstancia().getvErrores().add ( e1.getMessage() );
        }catch(Exception e){
            e.printStackTrace();
        }
        return false;
    }

    /**
     * Forma una condición (un AND) a partir de los valores contenidos en los atributos de la clase
     * Se utiliza en combinación con el método selectAll para restringir la selección de clientes.
     * @return
     */
    public String formaCondicionWhere(){
        String sCondicion = "";
        if (_iIdCliente!= 0)
            sCondicion += " IdCliente = " + _iIdCliente + " AND ";
        if (_sNombre.compareTo("")!= 0)
            sCondicion += "Nombre LIKE '" + this._sNombre + "%' AND ";
        if (_sApellidos.compareTo("")!= 0)
            sCondicion += " Apellidos LIKE '" + this._sApellidos + "%' AND ";
        if (Varios.comparaFechas(_dFechaNacimiento, new Date(0))!= 0)
            sCondicion += " FechaNacimiento = '" + Varios.dateToString (this._dFechaNacimiento) + "' AND ";
        if (_sSexo.compareTo("")!= 0)
            sCondicion += " Sexo = '" + this._sSexo + "' AND ";
        if (_sNacionalidad.compareTo("")!= 0)
            sCondicion += " Nacionalidad = '" + this._sNacionalidad + "' AND ";
        if (_sNivelEstudios.compareTo("")!= 0)
            sCondicion += " NivelEstudios = '" + this._sNivelEstudios + "' AND ";
        if (_sTipoDocumento.compareTo("")!= 0)
            sCondicion += " TipoDocumento = '" + this._sTipoDocumento + "' AND ";
        if (_sNumDocumento.compareTo("")!= 0)
            sCondicion += " NumDocumento = '" + this._sNumDocumento + "' AND ";

        //Quitar el último AND de la condición
        if (sCondicion.compareTo("") != 0)
            sCondicion = sCondicion.substring(0, sCondicion.lastIndexOf("AND") );
        return sCondicion;
    }
    /*
     * Valida los datos de la clase antes de hacer una inserción/actualización.
     * Se informa de los errores que se produzcan mediante un vector de String.
     */
    public boolean validar (){
        if ( this._sNombre.trim().equals("") )
            GestorErrores.getInstancia().getvErrores().add ("El nombre es obligatorio");
        if ( this._sApellidos.trim().equals("") )
            GestorErrores.getInstancia().getvErrores().add ("Los apellidos son obligatorios");
        if ( this._sTipoDocumento.trim().equals("") )
            GestorErrores.getInstancia().getvErrores().add ("El tipo de documento es obligatorio");
        if ( this._sNumDocumento.trim().equals("") )
            GestorErrores.getInstancia().getvErrores().add ("El número de documento es obligatorio");
        if ( this._sSexo.trim().equals("") )
            GestorErrores.getInstancia().getvErrores().add ("El sexo es obligatorio");
        if ( this._sNacionalidad.trim().equals("") )
            GestorErrores.getInstancia().getvErrores().add ("La nacionalidad es obligatoria");
        if ( this._sNivelEstudios.trim().equals("") )
            GestorErrores.getInstancia().getvErrores().add ("El nivel de estudios es obligatorio");
        if ( this._bExtranjero ){
            if ( this._iAniosResidencia == 0 )
                GestorErrores.getInstancia().getvErrores().add ("El número de años de residencia es obligatorio");
        }else{
            if ( this._iAniosResidencia != 0 )
                GestorErrores.getInstancia().getvErrores().add ("El número de años de residencia no procede");
            if ( this._bPermisoResidencia )
                GestorErrores.getInstancia().getvErrores().add ("El indicador de permiso de residencia no procede");
        }

        return (GestorErrores.getInstancia().getvErrores().size () == 0);
    }

    /*
     * Carga SOLO los atributos que conforman la clave de la clase a partir de 2 vectores,
     * uno con los nombres de los campos
     * y otro con los valores de los mismos.
     */
    public void vectorJTableAClavesClase ( Vector columnIdentifiers, Vector dataRow ){
        int iIndice = Varios.getPosCadena(columnIdentifiers, "IdCliente");
        this.inicializa();
        this._iIdCliente = Integer.parseInt( dataRow.get(iIndice).toString() );
    }

    /*
     * Devuelve un vector cargado con los atributos de la clase para mostrar en el JTable del panel.
     * El orden de los atributos es el indicado
     * en el vector con los nombres de los campos.
     */
    public Vector claseAVectorJTable ( Vector columnIdentifiers ){
        Vector resul = new Vector ();
        for (int i=0; i < columnIdentifiers.size(); i++){
            if ( ((String) columnIdentifiers.get(i)).compareToIgnoreCase("IdCliente") == 0 )
                resul.add( this._iIdCliente );
            else if ( ((String) columnIdentifiers.get(i)).compareToIgnoreCase("Nombre") == 0 )
                resul.add( this._sNombre );
            else if ( ((String) columnIdentifiers.get(i)).compareToIgnoreCase("Apellidos") == 0 )
                resul.add( this._sApellidos );
            else if ( ((String) columnIdentifiers.get(i)).compareToIgnoreCase("FechaNacimiento") == 0 )
                resul.add( this._dFechaNacimiento );
            else if ( ((String) columnIdentifiers.get(i)).compareToIgnoreCase("Sexo") == 0 )
                resul.add( this._sSexo );
            else if ( ((String) columnIdentifiers.get(i)).compareToIgnoreCase("Nacionalidad") == 0 )
                resul.add( this._sNacionalidad );
            else if ( ((String) columnIdentifiers.get(i)).compareToIgnoreCase("Extranjero") == 0 )
                resul.add( this._bExtranjero );
            else if ( ((String) columnIdentifiers.get(i)).compareToIgnoreCase("NivelEstudios") == 0 )
                resul.add( this._sNivelEstudios );
            else if ( ((String) columnIdentifiers.get(i)).compareToIgnoreCase("PermisoResidencia") == 0 )
                resul.add( this._bPermisoResidencia );
            else if ( ((String) columnIdentifiers.get(i)).compareToIgnoreCase("TipoDocumento") == 0 )
                resul.add( this._sTipoDocumento );
            else if ( ((String) columnIdentifiers.get(i)).compareToIgnoreCase("AniosResidencia") == 0 )
                resul.add( this._iAniosResidencia );
            else if ( ((String) columnIdentifiers.get(i)).compareToIgnoreCase("NumDocumento") == 0 )
                resul.add( this._sNumDocumento );
        }
        return resul;
    }

    /*
     * Este método recupera de la tabla un registro cuya clave primaria están cargados en los
     atributos de la clase correspondientes a la clave. Se recuperan los campos del registro y
     se carga el resto de los atributos de la clase.
     */
    public void recupera (){
        try {
            Statement st = GestorBD.getInstancia().getConexion().createStatement();
            ResultSet rs = st.executeQuery("SELECT * FROM " + this._sNombreTabla + " WHERE " +
                " IdCliente = " + this._iIdCliente);
            if ( rs.next() ) {
                this._sNombre = rs.getString("Nombre");
                this._sApellidos = rs.getString("Apellidos");
                this._dFechaNacimiento= rs.getDate("FechaNacimiento");
                this._sSexo= rs.getString("Sexo");
                this._sNacionalidad= rs.getString("Nacionalidad");
                this._bExtranjero= Varios.integerToBoolean(rs.getInt("Extranjero"));
                this._sNivelEstudios= rs.getString("NivelEstudios");
                this._bPermisoResidencia= Varios.integerToBoolean(rs.getInt("PermisoResidencia"));
                this._sTipoDocumento= rs.getString("TipoDocumento");
                this._iAniosResidencia= rs.getInt("AniosResidencia");
                this._sNumDocumento= rs.getString("NumDocumento");
            }
            rs.close();
            st.close();

        }catch (SQLException e1){
            GestorErrores.getInstancia().getvErrores().add ( e1.getMessage() );
        }catch(Exception e){
            e.printStackTrace();
        }
    }

    public void inicializa (){
        this._iIdCliente = 0;
        this._sNombre = "";
        this._sApellidos = "";
        this._dFechaNacimiento= new Date(0);
        this._sSexo= "";
        this._sNacionalidad= "";
        this._bExtranjero= false;
        this._sNivelEstudios= "";
        this._bPermisoResidencia= false;
        this._sTipoDocumento= "";
        this._iAniosResidencia= 0;
        this._sNumDocumento = "";
    }

    public Date getdFechaNacimiento() {
        return _dFechaNacimiento;
    }

    public void setdFechaNacimiento(Date _dFechaNacimiento) {
        this._dFechaNacimiento = _dFechaNacimiento;
    }

    public int getiAniosResidencia() {
        return _iAniosResidencia;
    }

    public void setiAniosResidencia(int _iAniosResidencia) {
        this._iAniosResidencia = _iAniosResidencia;
    }

    public String getsApellidos() {
        return _sApellidos;
    }

    public void setsApellidos(String _sApellidos) {
        this._sApellidos = _sApellidos;
    }

    public String getsDescripTabla() {
        return _sDescripTabla;
    }

    public void setsDescripTabla(String _sDescripTabla) {
        this._sDescripTabla = _sDescripTabla;
    }

    public String getsNacionalidad() {
        return _sNacionalidad;
    }

    public void setsNacionalidad(String _sNacionalidad) {
        this._sNacionalidad = _sNacionalidad;
    }

    public String getsNivelEstudios() {
        return _sNivelEstudios;
    }

    public void setsNivelEstudios(String _sNivelEstudios) {
        this._sNivelEstudios = _sNivelEstudios;
    }

    public String getsNombre() {
        return _sNombre;
    }

    public void setsNombre(String _sNombre) {
        this._sNombre = _sNombre;
    }

    public String getsNombreTabla() {
        return _sNombreTabla;
    }

    public void setsNombreTabla(String _sNombreTabla) {
        this._sNombreTabla = _sNombreTabla;
    }

    public String getsSexo() {
        return _sSexo;
    }

    public void setsSexo(String _sSexo) {
        this._sSexo = _sSexo;
    }

    public String getsTipoDocumento() {
        return _sTipoDocumento;
    }

    public void setsTipoDocumento(String _sTipoDocumento) {
        this._sTipoDocumento = _sTipoDocumento;
    }

    public boolean getbExtranjero() {
        return _bExtranjero;
    }

    public void setbExtranjero(String sNacionalidad) {
        if (sNacionalidad.compareTo("") != 0 )
            //El código 00 es el de España
            if (sNacionalidad.compareTo("00") != 0)
                this._bExtranjero = true;
            else
                this._bExtranjero = false;
    }

    public int getiIdCliente() {
        return _iIdCliente;
    }

    public void setiIdCliente(int _iIdCliente) {
        this._iIdCliente = _iIdCliente;
    }

    public boolean getbPermisoResidencia() {
        return _bPermisoResidencia;
    }

    public void setbPermisoResidencia(boolean _bPermisoResidencia) {
        this._bPermisoResidencia = _bPermisoResidencia;
    }

    public String getsNumDocumento() {
        return _sNumDocumento;
    }

    public void setsNumDocumento(String _sNumDocumento) {
        this._sNumDocumento = _sNumDocumento;
    }

    public String getsCondWhere() {
        return sCondWhere;
    }

    public void setsCondWhere(String sCondWhere) {
        this.sCondWhere = sCondWhere;
    }
    
}
